package com.wechat.enums;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

/**
 * 消息状态
 * 
 * @author 618lf
 */
@Getter
@RequiredArgsConstructor
public enum MessageFlag {

	// 0 ~ 7 发送状态
	/**
	 * 未发送
	 */
	Unsend(1 << 0),

	/**
	 * 发送中
	 */
	Sending(1 << 1),

	/**
	 * 发送失败
	 */
	SendFail(1 << 2),

	/**
	 * 发送成功
	 */
	SendSuccess(1 << 3),
	
	// 8 ~ 15 接收状态
	
	/**
	 * 接收中： 对于文件等需要异步接收的数据
	 */
	Recving(1 << 8),
	
	/**
	 * 接受成功
	 */
	Recved(1 << 9),
	
	
	// 16 ~ 31 操作
	
	/**
	 * 未读：如果已读则置为 0 
	 */
	Unread(1 << 16),
	
	;

	private final int flag;

	/**
	 * 是否未发送
	 * 
	 * @param flag
	 * @return
	 */
	public static boolean isUnsend(int flag) {
		return (Unsend.flag & flag) == flag;
	}

	/**
	 * 是否发送中
	 * 
	 * @param flag
	 * @return
	 */
	public static boolean isSending(int flag) {
		return (Sending.flag & flag) == flag;
	}

	/**
	 * 是否失败
	 * 
	 * @param flag
	 * @return
	 */
	public static boolean isSendFail(int flag) {
		return (SendFail.flag & flag) == flag;
	}

	/**
	 * 是否成功
	 * 
	 * @param flag
	 * @return
	 */
	public static boolean isSendSuccess(int flag) {
		return (SendSuccess.flag & flag) == flag;
	}

	/**
	 * 前4位是 发送标志位
	 * 
	 * @param flag
	 * @param opt
	 * @return
	 */
	public static int setSendFlag(int flag, MessageFlag opt) {
		return flag & 0xFFFFFFF0 | opt.flag;
	}
	
	/**
	 * 是否成功
	 * 
	 * @param flag
	 * @return
	 */
	public static boolean isUnread(int flag) {
		return (Unread.flag & flag) == flag;
	}
	
	/**
	 * 设置未读：16 位： 1110
	 * 
	 * @param flag
	 * @return
	 */
	public static int setUnread(int flag, MessageFlag opt) {
		return flag & 0xFFFEFFFF | opt.flag;
	}
}
